package singleton.example;

/**
 * 巧克力锅炉
 * 利用双重检查加锁 ,在getInstance()中减少使用同步
 * @author yaojianfeng
 */
public class ChocolateBoiler {
    /**
     * 是否是空的
     */
    private boolean empty;
    /**
     * 是否沸腾
     */
    private boolean boiled;
    /**
     * volatile关键词确保: 当uniqueInstance变量被初始化成singleton实例时,多个线程正确地处理
     */
    private volatile static ChocolateBoiler uniqueChocolateBoiler;
    private  ChocolateBoiler() {
        empty = true;
        boiled = false;
    }

    /**
     * 添加同步锁 解决多线程问题
     * @return
     */
    public static  ChocolateBoiler getInstance(){
        //检查实例 如果不存在 就进入同步区块 只有第一次才彻底执行这里的代码
        if (uniqueChocolateBoiler==null){
            synchronized (ChocolateBoiler.class){
                //进入区块后,再检查一次,如果仍然是null 才创建实例
                if (uniqueChocolateBoiler==null){
                    uniqueChocolateBoiler = new ChocolateBoiler();
                }
            }
            return new ChocolateBoiler();
        }
        return uniqueChocolateBoiler;
    }

    public boolean isEmpty(){
        String status = empty?"空的":"满的";
        System.out.println("锅炉里面是"+status+"的状态");
        return empty;
    }
    public boolean isBoiled(){
        String status = boiled?"沸腾的":"凉的";
        System.out.println("锅炉里面是"+status+"的状态");
        return boiled;
    }
    public void fill(){
        if (isEmpty()){
            empty = false;
            boiled = false;
            System.out.println("在锅炉里填满巧克力和牛奶的混合物");
        }
    }
    public void drain(){
        if (!isEmpty()&&isBoiled()){
            System.out.println("排出煮沸的巧克力和牛奶");
            empty = true;
        }
    }
    public void boil(){
        if (!isEmpty()&&!isBoiled()){
            System.out.println("将混合物煮沸");
            boiled = true;
        }
    }


}
